#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>   //程序替换的头文件
#include <string.h>
#include <ctype.h>    //isspace();  头文件
#include <sys/wait.h>   //wait();  头文件
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    while(1)
    {
        //打印minishell界面,和等待用户输入命令
        printf("[usrname@loncalhost]$ ");
        fflush(stdout);
        char cmd_buf[1024] = {0};
        fgets(cmd_buf,1024,stdin);
        
        
        //检查是否含有重定向操作符
        char *ptr = cmd_buf;
        char *filename = NULL;
        int r_flag = 0;
        while(*ptr != '\0')
        {
            if(*ptr == '>'){
                *ptr = '\0';
                r_flag++;
                ptr++;
                if(*ptr == '>'){
                    *ptr = '\0';
                    r_flag++;
                    ptr++;
                }
                while(isspace(*ptr))
                {
                    ptr++;
                }
                filename = ptr;
                while(!isspace(*ptr) && *ptr != '\0')
                {
                    ptr++;
                }
                *ptr = '\0';
            }
            ptr++;
        }
        if(filename != NULL){
            printf("filename = [%s]\n", filename);
        }

            
        //命令解析
        ptr = cmd_buf;
        int argc = 0;
        char *argv[32] = {NULL};
        while(*ptr != '\0')
        {
            if(!isspace(*ptr)){
                argv[argc] = ptr;
                argc++;
                while(!isspace(*ptr) && *ptr != '\0')
                {
                    ptr++;
                }
                *ptr = '\0';
            }
            ptr++;
        }
        int i = 0;
        for(i = 0; i < argc; i++)
        {
            printf("argv[%d]= [%s]\n", i,argv[i]);
        }
        

        
        //程序替换和命令执行
        pid_t pid = fork();
        if(pid < 0){
            perror("fork errro");
            continue;
        }else if(pid == 0){
            int fd = -1;
            if(r_flag == 1){ //清空重定向
                fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC,0664);
                dup2(fd,1);  //使文件描述符 1 和 fd 都指向 fd所在的位置
            }else if(r_flag == 2){ //追加重定向
                fd = open(filename,O_CREAT|O_WRONLY|O_APPEND,0664);
                dup2(fd,1);  
            }
            execvp(argv[0],argv);
            exit(0);
        }
        wait(NULL);    

    }
    
    
    
    return 0;
}
